
/* $Id: configfile.c 9 2009-12-29 12:25:52Z calicant $ */

#include "edilana.h"

#ifdef __unix__
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#endif

#ifdef __MSDOS__
#define SLASH '\\'
#else
#define SLASH '/'
#endif

#define	equal(a, b)	!strncmp(a, b, strlen(b))

static FILE	*input;
static int	linea = 0;
static char	nomeconfig[MAXSTRLEN];

static void errore (int code)
{

	fprintf(stderr, "%s: error on line %d [code %d]\n",
		nomeconfig, linea, code);
	if (input) fclose(input);
	Uscita(ERR_IN_CONFIGFILE);
}

static void pulisci (char s[], int l)
{
char *curs;

	curs = s + l;

	while (*curs != '\n' && isspace(*curs)) curs++;
	if (*curs == '\n')
		errore(1);
	else {
		strcpy(s, curs);
		s[strlen(s) - 1] = '\0';
	}
}

static int getnumero (char *lcorr, int min, int max, int lung)
{
int i;

	pulisci(lcorr, lung);
	i = atoi(lcorr);
	if (i < min || i > max)
		errore(2);
	else return i;
}

static void getstringa(char *out, char *lcorr, int lung)
{
	pulisci(lcorr, lung);
	strcpy(out, lcorr);
}

static void test_onoff (char *lcorr, int *interruttore)
{

	if (equal(lcorr, "on"))
		*interruttore = 1;
	else if (equal(lcorr, "off"))
		*interruttore = 0;
	else errore(3);

}

/*
 *  Verifica che la stringa di configurazione sia valida, stampando
 *  l'errore eventualmente incontrato
 */
static int verificaCfg (char *stringa, int lung)
{
char 	temp[MAXSTRLEN];
register int i, j;

	strcpy(temp,&stringa[1]);
	/* controlliamo se il numero dei comandi e' corretto */
	if (Stripnl(temp) != lung)
		return NUMERO_COMANDI_ERR;

	for (i = 0; temp[i]; i++) {
		/* non accettiamo caratteri alfabetici come comandi */
		if (isalpha(temp[i]))
			return NO_ALFABETICI;
		/* verifichiamo che non ci siano comandi doppi */
		for (j = 0; temp[j]; j++)
			if (temp[i] == temp[j] && i != j)
				return COMANDO_DOPPIO;
	}

return 0;
}

extern struct Setup *conf;

int ConfigfileSetup (char *comando)
{
char	lcorr[MAXSTRLEN];
int	i;

	strcpy(nomeconfig, CONFIGFILE);

	if ((input = fopen(nomeconfig, "r")) == NULL) {
		#ifdef __unix__
		strcpy(nomeconfig, getenv("HOME"));
		strcat(nomeconfig, "/." CONFIGFILE);
		#endif
		#ifdef AMIGA
		strcpy(nomeconfig, "S:");
		strcat(nomeconfig, CONFIGFILE);
		#endif
		#ifdef __MSDOS__
		strcpy(nomeconfig, "C:\\");
		strcat(nomeconfig, CONFIGFILE);
		#endif
		if ((input = fopen(nomeconfig, "r")) == NULL) {
			#ifdef __unix__
			strcpy(nomeconfig, "/etc/");
			strcat(nomeconfig, CONFIGFILE);
			if ((input = fopen(nomeconfig, "r")) == NULL)
			#endif
				return 0;
		}
	}

	conf->configflag = 1;
	strcpy(conf->configfile, nomeconfig);

	while (fgets(lcorr, MAXSTRLEN, input) != NULL) {
		linea++;

		if (*lcorr == '#' || *lcorr == '\n')
			continue;

		if (*lcorr == '~') {
			if ((i = verificaCfg(lcorr, strlen(comando))) == 0) {
				strcpy(conf->comando, &lcorr[1]);
				printf(" *** config file found (%c = help)\n",
					comando[1]);
			}
			else IoDico(i);
		}

		else if (equal(lcorr, "TEMPDIR")) {
			pulisci(lcorr, strlen("TEMPDIR"));
			if (lcorr[strlen(lcorr) - 1] != SLASH)
				errore(4);
			strcpy(conf->tempdir, lcorr);
			
		}
		else if (equal(lcorr, "LOGFILE"))
			 getstringa(conf->logfile,
				    lcorr, strlen("LOGFILE"));

		else if (equal(lcorr, "VOCABOLARIO"))
			getstringa(conf->vocabolario,
				   lcorr, strlen("VOCABOLARIO"));

		else if (equal(lcorr, "LISTANOMI"))
			getstringa(conf->listanomi,
				   lcorr, strlen("LISTANOMI"));

		else if (equal(lcorr, "VOCABNOMI"))
			getstringa(conf->vocabnomi,
				   lcorr, strlen("VOCABNOMI"));

		else if (equal(lcorr, "ALTROVOCAB"))
			getstringa(conf->altrovocab,
				   lcorr, strlen("ALTROVOCAB"));

		else if (equal(lcorr, "LEMMARIO"))
			getstringa(conf->lemmario,
				   lcorr, strlen("LEMMARIO"));

		else if (equal(lcorr, "COLORPROMPT"))
			conf->colorprompt = getnumero(lcorr, 
				COLORE_MIN, COLORE_MAX,
				strlen("COLORPROMPT"));

		else if (equal(lcorr, "COLORESTO"))
			conf->coloresto = getnumero(lcorr,
				COLORE_MIN, COLORE_MAX,
				strlen("COLORESTO"));

		else if (equal(lcorr, "NUMCOLONNE"))
			conf->numcolonne = getnumero(lcorr,
				40, 200, strlen("NUMCOLONNE"));

		else if (equal(lcorr, "NUMRIGHE"))
			conf->numrighe = getnumero(lcorr,
				10, 100, strlen("NUMRIGHE"));

		else if (equal(lcorr, "MODOR")) {
			pulisci(lcorr, strlen("MODOR"));
			if (equal(lcorr, "auto_rsp"))
				conf->modor = 4;
			else if (equal(lcorr, "auto_rs"))
				conf->modor = 2;
			else if (equal(lcorr, "auto_r"))
				conf->modor = 1;
			else if (equal(lcorr, "off"))
				conf->modor = 0;
			else errore(5);
		}

		else if (equal(lcorr, "DATALOG")) {
			pulisci(lcorr, strlen("DATALOG"));
			test_onoff(lcorr, &conf->datalog);
		}

		else if (equal(lcorr, "RANDOM")) {
			pulisci(lcorr, strlen("RANDOM"));
			test_onoff(lcorr, &conf->random);
		}

		else if (equal(lcorr, "NOMECOGNOME")) {
			getstringa(conf->nomecognome,
				   lcorr, strlen("NOMECOGNOME"));
			conf->nome = 1;
		}

		else if (equal(lcorr, "MINLENW"))
			conf->minlenw = getnumero(lcorr, 0, 10,
				strlen("MINLENW"));

		else if (equal(lcorr, "MINLENCANDY"))
			conf->minlencandy = getnumero(lcorr, 
				0, 10, strlen("MINLENCANDY"));

		else if (equal(lcorr, "TRUNCANDY"))
			conf->truncandy = getnumero(lcorr,
				0, 10, strlen("TRUNCANDY"));

		else if (equal(lcorr, "SORTCMD"))
			getstringa(conf->sortcmd,
				   lcorr, strlen("SORTCMD"));

		else if (equal(lcorr, "AUTOFUSIONE")) {
			pulisci(lcorr, strlen("AUTOFUSIONE"));
			test_onoff(lcorr, &conf->autofusione);
		}

		else if (equal(lcorr, "STAMPACANDY")) {
			pulisci(lcorr, strlen("STAMPACANDY"));
			test_onoff(lcorr, &conf->stampacandy);
		}

		else if (equal(lcorr, "AUTOCANDY")) {
			pulisci(lcorr, strlen("AUTOCANDY"));
			test_onoff(lcorr, &conf->autocandy);
		}

		else if (equal(lcorr, "PROMPTORA")) {
			pulisci(lcorr, strlen("PROMPTORA"));
			test_onoff(lcorr, &conf->promptora);
		}

		else if (equal(lcorr, "UNIQCMD"))
			getstringa(conf->uniqcmd,
				   lcorr, strlen("UNIQCMD"));

		else if (equal(lcorr, "CATCMD"))
			getstringa(conf->catcmd,
				   lcorr, strlen("CATCMD"));

		else if (equal(lcorr, "ANAGCMD"))
			getstringa(conf->anagcmd,
				   lcorr, strlen("ANAGCMD"));
		else errore(6);
	}

return 1;
}
